package estadistec.grafico;

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.beans.PropertyChangeListener;
import java.util.*;

import estadistec.logica.SuperGestor;
import estadistec.logica.tabla.TipoTabla;

/**
 * @author pcorrales julate
 */

/**
 *Clase que extiende de  JmenuBAR, esta clase contiene el diseno
 *del menu de la aplicacion, asi como la invocacion a los eventos de cada uno 
 *de los item 
 */

public class Menu  extends JMenuBar implements ConstantesGraficas
{
   /**
    * Instancia del SuperGestor.
    */
	private static SuperGestor _superGestor;
	   
	/**
	 * La clase  ArbolMenu es una clase static la cual nos permite 
	 * construir la estructura que requerimos para la elaboracion de 
	 * nuestro menu
	 */
	private static class ArbolMenu 
			extends Vector<ArbolMenu> 
			implements ActionListener{

	   /*
	    * declaracion de variables 
	    */
		private boolean esMenu;
		private String nombre;

		/**
		 * Constructor1 se inicializa con el nombre del arbol
		 * @param nombre
		 */
		public ArbolMenu(String nombre)
		{
			this.nombre=nombre;
			esMenu=false;
		}
		/**
		 * Constructor2 se inicializa con el nombre y un arreglo de sus hijos
		 * @param nombre
		 * @param opciones
		 */

		public ArbolMenu(String nombre, ArbolMenu[] opciones){
			this.nombre=nombre;
			esMenu=true;
			for(int i=0; i<opciones.length; i++)
				this.addElement(opciones[i]);
		}
        /***
         * Metodo para slolicitar el arbol de meniu de algunos de lso hijos del menu
         * @return el menu
         */
		public JMenuItem getMenu()
		{
			/*
			 * retorna el arbol de menu
			 */
			if(esMenu)
			{
				JMenu menu=new JMenu(nombre);
				for(ArbolMenu submenu: this)
					menu.add(submenu.getMenu());
				return menu;
			}
			/*
			 * retorna el item de un arbolMenu
			 */
			else
			{
				JMenuItem item =new JMenuItem(nombre);
				item.addActionListener(this);
				return item;
				
			}
		}
		
		/*
		 *manejador de eventos
		 */
		 public void actionPerformed(ActionEvent e)
	     {
			     JMenuItem source = (JMenuItem)(e.getSource());
				
				 if(source.getText() == "Nuevo" )
				 { 
					 System.out.println("nuevo");
				 }
				 else if(source.getText()== "Guardar")
				 {
					 System.out.println("guardar");
				 }
				 else if(source.getText() == "Guardar como")
				 {
					 System.out.println("guardar como");
				 }
				 else if(source.getText()== "Salir")
				 {
					 System.out.println("salir");
				 }
				 else if(source.getText() == "Rehacer")
				 {
					 System.out.println("rehacer");
				 }
				 else if(source.getText() == "Copiar")
				 {
					 System.out.println("copiar");
				 }
				 else if(source.getText() == "Pegar")
				 {
					 System.out.println("pegar");
				 }
				 
				 /*
				  * crear una nueva tabla y agregarla al escritorio actual
				  * */
				 else if(source.getText() == "Tabla Normal")
				 {
					 _superGestor.crearTabla(TipoTabla.NORMAL);
				 }
				 
				 else if(source.getText() == "Tabla Muestra")
				 {
					 System.out.println("muestra");
				 }
				 else if(source.getText() == "Tabla Resumen")
				 {
					 System.out.println("resumen");
				 }
				 else if(source.getText() == "Tipo")
				 {
					 System.out.println("letra");
				 }
				 else if(source.getText() == "Tamano")
				 {
					 System.out.println("letra tamano");
				 }
				 else if(source.getText() == "Acerca")
				 {
					 System.out.println("acerca");
				 }
				 else if(source.getText() == "Ayuda de ")
				 {
					 
				 }
				 else if(source.getText() == "Grafica Barras")
				 {
					 System.out.println("barras");
				 }
				 else if(source.getText() == "Grafico Poligono de Frecuencias")
				 {
					 System.out.println("Grafico Poligono de Frecuencia");
				 }
				 else if(source.getText() == "Grafico Circular")
				 {
					 System.out.println("Grafico Circular");
				 }
				 else if(source.getText() == "Grafico Ojiva")
				 {
					 System.out.println("Grafico Ojiva");
				 }
				 else if(source.getText() == "Grafica Puntos")
				 {
					 System.out.println("Grafica puntos");
				 }
				 else if(source.getText() == "Cascada")
				 {
				    _superGestor.ordenarCascada(); 
				 }
				 else if (source.getText() == "Cuadricula")
				 {
					 _superGestor.ordenarCuadricula(); 
				 }
	     }
		
		   
		 
	}

   /** ESTRUCTURA DEL MENU DE LA APLICACION  DE LA CLASE STATIC MENU
    *Archivo
	*	--Abrir
	*	--Guardar
	*	--Guardar como ...
	*	--Salir
	*
    *
	*	Editar
	*	--Deshacer
	*	--Rehacer
	*	--Copiar
	*	--Pegar
    *
	*	Herramientas
	*	--Nueva Tabla
	*	----Normal
	*	----Muestra
	*	----Resumen
	*	--Nuevo Grafico
    *
	*	Propiedades
	*	--Tipo letra ...
	*	--Tam;o letra ...
    *
   	*	Ayuda
	*	--Ayuda
	*	--Acerca de ...
	*/

	public static final ArbolMenu [] MENU ={
		new ArbolMenu("Archivo", new ArbolMenu[]{
			new ArbolMenu("Nuevo"),
			new ArbolMenu("Guardar"),
			new ArbolMenu("Guardar como"),
			new ArbolMenu("Salir"),
		}),
		new ArbolMenu("Editar", new ArbolMenu[]{
			new ArbolMenu("Rehacer"),
			new ArbolMenu("Copiar"),
			new ArbolMenu("Pegar"),
		}),
		new ArbolMenu("Herramientas", new ArbolMenu[]{
			new ArbolMenu("Nueva Tabla", new ArbolMenu[]{
				new ArbolMenu("Tabla Normal"),
				new ArbolMenu("Tabla Muestra"),
				new ArbolMenu("Tabla Resumen"),
			}),
			new ArbolMenu("Nueva Grafica", new ArbolMenu[]{
				new ArbolMenu("Grafica Barras"),
				new ArbolMenu("Grafica Poligono de Frecuencias"),
				new ArbolMenu("Grafico Circular"),
				new ArbolMenu("Grafica Ojiva"),
				new ArbolMenu("Grafica Puntos"),
			}),
		}),
		new ArbolMenu("Propiedades", new ArbolMenu[]{
			new ArbolMenu("Tipo"),
			new ArbolMenu("Tamano"),

		}),
		new ArbolMenu("Ayuda", new ArbolMenu[]{
			new ArbolMenu("Acerca"),
			new ArbolMenu("Ayuda de "),

		}),
		
		new ArbolMenu("Ordenar Ventanas ", new ArbolMenu[]{
				new ArbolMenu("Cascada"),
				new ArbolMenu("Cuadricula"),

			}),
	};
	


	/*
	 * constructor
	 */
	public Menu()
	{
		_superGestor = SuperGestor.getInstancia();
		InicializarMenu();
	}

	/**
	 * M�todo encargado de inicializar el menu, recorre el arbolMENU principal y crea cada uno de los arboles
	 * con sus respectivos hijos
	 */
	public void InicializarMenu()
	{
		for(int i=0; i<MENU.length; i++)
		{
			this.add((JMenu)(MENU[i].getMenu()));
		}
	}


	/**
	 * M�todo hacer visible la barra
	 */
	public void iniciar()
	{
		this.setVisible(true);
	}

	/**
	 * M�todo para hacer invisible la barra
	 */
	public void terminar()
	{
		this.setVisible(false);
	}
   
}
